package main

import (
	"flag"
	"fmt"
	"operation/core"
	"os"
	"os/exec"
	"strings"

	"golang.org/x/term"
)

func main() {
	// 获取窗口宽度
	windowWidth, err := getWidth()

	if err != nil {
		fmt.Println("获取窗口宽度报错：", err)
		return
	}
	// windowWidth := 150
	var srcPath, destPath, pwd, unitStr, suffix string
	var handle int
	var isBar bool
	flag.StringVar(&srcPath, "s", "test.txt", "要加密的文件完整路径")
	flag.StringVar(&destPath, "d", "temp", "要输出的文件路径建议保留原文件格式后缀，默认放在根下/win放在对应的盘符的根目录下")
	flag.StringVar(&pwd, "p", "123", "加密的密码（数字|字母|特殊字符） 如果有空格，则视为多重加密。密码顺序很关键。")
	flag.IntVar(&handle, "t", 0, "操作：加密0,解密1")
	flag.BoolVar(&isBar, "b", false, "是否显示进度条，默认显示")
	flag.StringVar(&unitStr, "u", "MB", "显示单位[B|KB|MB|GB|TB]，默认MB")
	flag.StringVar(&suffix, "suf", "xtt", "设置加密后的文件后缀xtt多重加密版本")
	flag.Parse()

	// ////test code
	// srcPath = "xt78h2vK4i.gif"
	// destPath = "xt78h2vK4i.gif"
	// pwd = "mes mes"
	// handle = 0

	// 要打印的消息
	var msg []string = []string{" 加密完成", " 解密完成", "正在加密中……", "正在解密中……"}
	// 如果是选择加密选项，对目标文件进行添加后缀和检测存在性。反之则不处理。
	if handle == 0 {
		// 添加加密文件的后缀
		destPath = destPath + "." + suffix
	}
	if !isBar {
		fmt.Println(msg[handle+2])
	}
	// 检测新的文件路径是否存在。
	destPath = core.FileStatus(destPath)
	ok, err := core.Display(srcPath, destPath, strings.ToUpper(unitStr), pwd, isBar, windowWidth)
	if !ok {
		fmt.Println(err)
		return
	}
	fmt.Println(msg[handle])
}

// 获取窗口宽度，用于设置进度条的长度
func getWidth() (windowWidth int, err error) {

	// 如果是windows系统
	platForm := getPlatform()
	if platForm == "Windows_NT" {
		fd := int(os.Stdout.Fd())
		w, _, err := term.GetSize(fd)
		if err != nil {
			return windowWidth, err
		}
		windowWidth = w
	}
	if platForm == "posix" {
		cmd := exec.Command("stty", "size")
		cmd.Stdin = os.Stdin
		out, err := cmd.Output()
		if err != nil {
			return windowWidth, err
		}
		var rows, cols int
		_, err = fmt.Sscanf(string(out), "%d %d", &rows, &cols)
		if err != nil {
			return windowWidth, err
		}
		windowWidth = cols
	}
	return windowWidth, err

}

// 获取操作系统类型
func getPlatform() string {
	const windows = "Windows_NT"
	// 判断系统os的参数，排除win系统下的MS系统，如git，MING64这样的系统。
	if os.Getenv("OS") == windows && os.Getenv("MSYSTEM") == "" {
		return windows
	}
	return "posix"
}
